import torch 
import torch.nn as nn 



if __name__ == "__main__":
    t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
    
    t2 = torch.rand((1, 2, 3))
    print("rand: " + str(t2.shape))
    t3 = torch.ones((2, 2, 3))
    print("ones: " + str(t3.shape))
    t4 = torch.zeros((2, 3, 5))
    # view 经常用 比如cnn层后面最后接全联接层，需要view函数展平矩阵.
    t1 = t1.view((3, 2)) 
    print("view: " + str(t1.shape))
    # permute  rnn lstm 中常用 需要把time_step 放到最前面，输入到模型.
    t1 = torch.rand((3, 4, 5))
    print("permute: " + str(t1.permute(2, 1, 0).shape))
    # cat 一般用于特征维度的连接 后面具体可以看UNet网络
    t1 = torch.rand((2, 3))
    t2 = torch.rand((2, 4))
    print("cat: " + str(torch.cat((t1, t2), dim=-1).shape))
    # 常用于图片 如果本来只有一个channel 那么很可能读取出来得到（128, 128） 这时候输入到cnn则需要这个函数
    t1 = torch.rand((2, 2))
    print("unsqueeze: " + str(t1.unsqueeze(dim=-1).shape))
    # 经常使用！
    t1 = torch.rand((2, 2, 1))
    print("squeeze: " + str(t1.squeeze(dim=-1).shape))

    # 比如gan 生成器生成图片，给判别器判别计算loss，这里面只需要更新判别器参数，因此需要把生成器数据从计算图中分离，避免去计算loss！
    t1 = torch.rand((2, 2, 2))
    t1.detach() # 从计算图中分离

    # 一般求loss值的时候用～ 把标量转换为一个数字
    t1 = torch.tensor([1])
    print("item: " + str(t1.item()))

    ## device 转换 经常使用
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    t1 = torch.tensor([1, 2, 3])
    t1 = t1.to(device)

    ##  画图的时候经常用
    t1 = torch.linspace(0, 1, 100) # 

    ## dim 非常经常使用 重点在于 保留 行还是列!
    t1 = torch.tensor([[1, 2], [3, 4]])
 
    print(torch.sum(t1, dim=0))





